<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 
<html>
<head>
<title>Ereignisse und Signale  in PyQt4</title>
<link rel="stylesheet" href="../format.css" type="text/css">
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<meta name="keywords" content="PyQt, PyQt4, events, signals, tutorial, python, Linux">
<meta nam="description" content="Ereignisse und Signale in PyQt4">
<meta name="language" content="de">
<meta name="author" content="Jan Bodnar">
<meta name="distribution" content="global">
<meta name="translation" content="manuel stein">
</head>

<body>

<div class="content">


<a href="/" title="Home">Home</a>&nbsp;
<a href=".." title="Home">Contents</a>


<h1>Ereignisse und  Signale in PyQt4</h1>


<p>
In diesem Abschnitt des PyQt4-Programmier-Tutorials untersuchen 
wir die in Anwendungen auftretenden Ereignisse und Signale.
</p>

<h3>Ereignisse</h3>

<p>
Ereignisse sind ein wichtiger Teil der Programmierung von Benutzeroberflächen. 
Ereignisse werden von Nutzern oder dem System erzeugt. Wenn wir die <em>exec_()</em>-Methode einer 
Anwendung aufrufen, tritt sie in die Hauptschleife. Die Hauptschleife empfängt
Ereignisse und sendet sie an die Objekte weiter. Trolltech hat ein einzigartiges Signal-Slot-System eingeführt.
</p>

<h3>Signale &amp; Slots</h3>

<p>
Signale werden geworfen, wenn Nutzer einen Knopf drücken, einen Regler ziehen 
<abbr title="et cetera">etc.</abbr> Signale können außerdem durch die Umgebung 
ausgelöst werden, <acronym title="zum Beispiel">z.B.</acronym> wenn eine Uhr tickt. 
Ein Slot ist eine Methode, die auf ein Signal reagiert. In Python kann alles aufrufbare ein Slot sein.
</p>


<pre class="code">
#!/usr/bin/python

# sigslot.py

import sys
from PyQt4 import QtGui, QtCore


class SigSlot(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('signal &amp; slot')

        lcd = QtGui.QLCDNumber(self)
        slider = QtGui.QSlider(QtCore.Qt.Horizontal, self)

        vbox = QtGui.QVBoxLayout()
        vbox.addWidget(lcd)
        vbox.addWidget(slider)

        self.setLayout(vbox)
        self.connect(slider,  QtCore.SIGNAL('valueChanged(int)'), lcd, 
		QtCore.SLOT('display(int)') )

        self.resize(250, 150)


app = QtGui.QApplication(sys.argv)
qb = SigSlot()
qb.show()
sys.exit(app.exec_())
</pre>

<p>
In unserem Beispiel zeigen wir eine LCD-Ziffer und einen Regler an. Über das Ziehen des Reglers ändern wir die LCD-Ziffer.
</p>

<pre class="explanation">
 self.connect(slider,  QtCore.SIGNAL('valueChanged(int)'), lcd, QtCore.SLOT('display(int)') )
</pre>

<p>
Wir verbinden ein <em>valueChanged()</em>-Signal des Schiebereglers mit dem <em>display()</em>-Slot der LCD-Ziffer.
</p>

<p>
Die <em>connect()</em>-Methode hat vier Parameter. Der <strong>Sender</strong> ist ein 
Objekt, das ein Signal sendet. Das <strong>Signal</strong> ist ein Signal, 
das geworfen wird. Der <strong>Empfänger</strong> ist ein Objekt, das ein 
Signal empfängt. Schließlich ist der <strong>Slot</strong> die Methode, die auf das Signal reagiert.
</p>


<img src="../images/signalslot.jpg" alt="Signale &amp; Slots" >
<p class="figure">Abbildung: Signale &amp; Slots</p>

<h3>Neuimplementierung eines Ereignis-Handlers</h3>

<p>
Ereignisse in PyQt werden vorwiegend durch die Neuimplementierung eines Ereignis-Handlers hergestellt.
</p>

<pre class="code">
#!/usr/bin/python

# escape.py

import sys
from PyQt4 import QtGui, QtCore

class Escape(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('escape')
        self.resize(250, 150)
        self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )


    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.close()

app = QtGui.QApplication(sys.argv)
qb = Escape()
qb.show()
sys.exit(app.exec_())
</pre>

<p>
Im Beispiel reimplementieren wir den <em>keyPressEvent()</em>-Ereignis-Handler.
</p>


<pre class="explanation">
 def keyPressEvent(self, event):
     if event.key() == QtCore.Qt.Key_Escape:
         self.close()
</pre>

<p>
Wenn wir die Escape-Taste drücken, schließen wir damit die Anwendung.
</p>

<h3>Werfen von Signalen</h3>

<p>
Objekte, die mittels des <em>QtCore.QObject</em> erzeugt wurden, können 
Signale werfen. Wenn wir auf einen Knopf drücken, wird 
ein <em>clicked()</em>-Signal erzeugt. Im folgenden Beispiel 
werden wir sehen, wie wir ein Signal werfen können.
</p>

<pre class="code">
#!/usr/bin/python

# emit.py

import sys
from PyQt4 import QtGui, QtCore


class Emit(QtGui.QWidget):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)

        self.setWindowTitle('emit')
        self.resize(250, 150)
        self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )

    def mousePressEvent(self, event):
        self.emit(QtCore.SIGNAL('closeEmitApp()'))

app = QtGui.QApplication(sys.argv)
qb = Emit()
qb.show()
sys.exit(app.exec_())
</pre>

<p>
Wir erzeugen hier ein neues Signal namens <em>closeEmitApp()</em>. 
Dieses Signal wird während eines Mausklick-Ereignisses geworfen.
</p>

<pre class="explanation">
 def mousePressEvent(self, event):
     self.emit(QtCore.SIGNAL('closeEmitApp()'))
</pre>

<p>
Werfen eines Signals mit der <em>emit()</em>-Methode.
</p>

<pre class="explanation">
 self.connect(self, QtCore.SIGNAL('closeEmitApp()'), QtCore.SLOT('close()') )
</pre>

<p>
Hier verbinden wir das von Hand erzeugte <em>closeEmitApp()</em>-Signal mit dem <em>close()</em>-Slot.
</p>

<div class="footer">
<div class="signature">
<a href="/">ZetCode</a> last modified September 23, 2007  <span class="copyright">&copy; 2007 - 2011 Jan Bodnar</span>
<span class="copyright">Translation © 2009 Manuel Stein</span>
</div>
</div>

</div> <!-- content -->
</body>
</html>

